<!--
LA PRIMERA PARTE SON FUNCIONES Y CLASES

HACIA EL FINAL DEL FICHERO ESTÁ LA CONFIGURACIÓN DE LA BASE DE DATOS Y EL CÓDIGO PROBADO.
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Pruebas</title>
    </head>
    <body>
        <?php
       // put your code here
        //include "structHandlerClass.php";
        include "dataHandlerClass.php";
        //Clase para el temporizador
            class simple_profiler {

                private $start_time;

                private function get_time() {
                    list($usec, $seconds) = explode(" ", microtime());
                    return ((float)$usec + (float)$seconds);
                }
                function start_timer() {
                    $this->start_time = $this->get_time();
                }
                function end_timer() {
                    return ($this->get_time() - $this->start_time);
                }
            }

        //----------------------------------------------------------------------

        function conecta($dbhost,$dbusername,$dbpass,$database){
            $link=DB::connect($dbhost,$dbusername,$dbpass);
            if (!$link) {
                die('Could not connect: ' . mysql_error());
                return FALSE;
            }
            if(!DB::select_db($database,$link)){
                    DB::close($link);
                    die('Could not connect: ' . mysql_error());
                    return FALSE;
            }
            return $link;
        }

        //----------------------------------------------------------------------

        function reinicia(){
            $query= array(  'DROP TABLE data;',
                            'DROP TABLE structure;',
                            'DROP TABLE elements',
                            //Tabla estructura
                            "CREATE TABLE structure (
                                id INT(11) AUTO_INCREMENT PRIMARY KEY,
                                value VARCHAR(100) NOT NULL,
                                type VARCHAR(20) NOT NULL,
                                lft INT(6) NOT NULL,
                                rgt INT(6) NOT NULL
                            );",
                            //Indice sobre value
                            "CREATE UNIQUE INDEX IDX_STRUCT ON structure (value);",
                            //Tabla datos
                            "CREATE TABLE data(
                                id INT(11)NOT NULL,
                                id_structure INT(11)NOT NULL,
                                value VARCHAR(100)NOT NULL,
                                PRIMARY KEY(id,id_structure),
                                FOREIGN KEY (id_structure)
                                REFERENCES structure(id),
                                FOREIGN KEY (id)
                                REFERENCES elements(id)
                            );",
/*
                            "ALTER TABLE data ADD CONSTRAINT ref1
                            FOREIGN KEY (id) REFERENCES element(id);",

                            "ALTER TABLE data ADD CONSTRAINT ref2
                            FOREIGN KEY (id_structure) REFERENCES structure(id);",
*/
                            //sobra este indice (primary key index)
                            //"CREATE UNIQUE INDEX IDX_DATA ON data (id,id_structure);",
                            //Tabla elementos
                            "CREATE TABLE elements(
                                type CHAR(20),
                                id INT (11) AUTO_INCREMENT PRIMARY KEY ,
                                name VARCHAR(50)
                            );",
                            "CREATE INDEX IDX_ELEMENTS ON elements(name) "
                            );

            foreach ($query as $q) DB::query($q);
            
        }
        //----------------------------------------------------------------------

        function creaEstructura(){
            //RAIZ
            StructHandler::addChild('SISTEMA',"node","","");

            //PRIMER NIVEL
            StructHandler::addChild('USR',"element","/SISTEMA","");
            StructHandler::addChild('RSC',"element","/SISTEMA","");
            StructHandler::addChild('HIS',"element","/SISTEMA","");

            //SEGUNDO NIVEL
            StructHandler::addChild('LOGIN',"node","/SISTEMA/USR","");
            StructHandler::addChild('GESTION',"node","","/SISTEMA/USR/LOGIN");
            StructHandler::addChild('ACTIVIDAD',"node","","/SISTEMA/USR/GESTION");


            StructHandler::addChild('LOCALIZACION',"node","/SISTEMA/RSC","");
            StructHandler::addChild('CATEGORIZACION',"node","/SISTEMA/RSC","");

            StructHandler::addChild('NOTA',"integer","/SISTEMA/HIS","");
            StructHandler::addChild('COMENTARIOS',"string","/SISTEMA/HIS","");

            //TERCER NIVEL
            StructHandler::addChild('USERNAME',"string","/SISTEMA/USR/LOGIN","");
            StructHandler::addChild('PASSWORD',"string","/SISTEMA/USR/LOGIN","");

            StructHandler::addChild('E_MAIL',"string","/SISTEMA/USR/GESTION","");
            StructHandler::addChild('NOMBRE_REAL',"string","/SISTEMA/USR/GESTION","");

            StructHandler::addChild('FECHA_REGISTRO',"date","/SISTEMA/USR/ACTIVIDAD","");
            StructHandler::addChild('ULTIMO_ACCESO',"date","/SISTEMA/USR/ACTIVIDAD","");



            StructHandler::addChild('PLATAFORMA',"string","/SISTEMA/RSC/LOCALIZACION","");
            StructHandler::addChild('ID_EXTERNO',"integer","/SISTEMA/RSC/LOCALIZACION","");
            StructHandler::addChild('ENTORNO_PROFESIONAL',"node","/SISTEMA/RSC/CATEGORIZACION","");
            StructHandler::addChild('ENTORNO_ACADEMICO',"node","/SISTEMA/RSC/CATEGORIZACION","");

            //CUARTO NIVEL


            StructHandler::addChild('AMBITO_LABORAL',"string","/SISTEMA/RSC/CATEGORIZACION/ENTORNO_PROFESIONAL","");
            StructHandler::addChild('SECTOR',"string","/SISTEMA/RSC/CATEGORIZACION/ENTORNO_PROFESIONAL","");
            StructHandler::addChild('PUESTOS_DE_TRABAJO',"string","/SISTEMA/RSC/CATEGORIZACION/ENTORNO_PROFESIONAL","");
            StructHandler::addChild('NIVEL',"integer","/SISTEMA/RSC/CATEGORIZACION/ENTORNO_ACADEMICO","");
            StructHandler::addChild('AREA_DE_CONOCIMIENTO',"string","/SISTEMA/RSC/CATEGORIZACION/ENTORNO_ACADEMICO","");


            return true;
        }

        //----------------------------------------------------------------------

        function muestraArbol(){
            $result=DB::query("SELECT node.lft, node.rgt, node.type,CONCAT( REPEAT( '__', (COUNT(parent.value) - 1) ), node.value) AS value
                                FROM structure AS node,
                                structure AS parent
                                WHERE node.lft BETWEEN parent.lft AND parent.rgt
                                GROUP BY node.value
                                ORDER BY node.lft;");
            
            while ($r1=DB::fetch_assoc($result)){
                $fields= explode ('/',$r1['value']);
                $nc=count($fields);
                $n=array();
                for($i=0;$i<$nc-1;$i++){
                    $n[$i]=$fields[$i];
                }
                $n1=implode('/',$n);
                echo "<font color='#FF0000'>$n1</font>";
                echo "<font color='#0000CC'>/". $fields[$nc-1] ."</font>";
                echo "<font color='#339966'> ". $r1['type']."</font>";
                echo "<font color='#FF0000'> (".$r1['lft']."|".$r1['rgt'].") </font><BR>";                    
            }
            
        }

        //----------------------------------------------------------------------
        function inicializaArrayNombres(){
           //Obsoleta
        }

        //----------------------------------------------------------------------

        function insertaDatos($inicio,$nusers,$nombres){
            //Obsoleta
        }

        //----------------------------------------------------------------------

        function creaUsuarios($nusers){
            //Obsoleta
        }

        //----------------------------------------------------------------------

        function muestraUsuarios($inicio,$nusers,$mostrar,$nombres){
            //Obsoleta
        }
        //----------------------------------------------------------------------


//CONFIGURACIÓN DE LAS PRUEBAS

//CONEXION A LA BASE DE DATOS
$dbhost="localhost";
$dbusername="root";
$dbpass="";
$database="pruebas";

//OPCIONES:
$reiniciar=true; //Borrar y crear tablas
$probar=true; //a falso no se hace la parte del codigo a probar


//CONEXION A BASE DE DATOS
        $timer=new simple_profiler();

        echo "CONECTANDO A BASE DE DATOS ";
        $timer->start_timer();
            $link=conecta($dbhost,$dbusername,$dbpass,$database);
        $tiempo=$timer->end_timer();
        echo " | CONECTADO: tiempo: $tiempo <BR>";

//REINICIAR BASE DE DATOS
        if($reiniciar){
            echo "REINICIANDO BASE DE DATOS ";
            $timer->start_timer();
                reinicia();
            $tiempo=$timer->end_timer();
            echo " | REINICIADA: tiempo: $tiempo<BR>";

            echo "CREANDO ESTRUCTURA DE ARBOL ";
            $timer->start_timer();
                creaEstructura();
            $tiempo=$timer->end_timer();
            echo " | CREADA: tiempo: $tiempo<BR>";

        }

        muestraArbol();
        echo "<BR><BR><BR><BR><BR>";

if($probar){

    echo "COMIENZA LA EJECUCIÓN DEL CÓDIGO DE PRUEBAS <BR>";

    $tiposD=array(1 =>"integer",2 =>"string",3 =>"date",4 =>"element",5 =>"real",6 =>"boolean",7 =>"node");
    $tiposE=array(1 =>"USR",2 =>"RSC",3 =>"HIS");

    $nombresU=array(1 =>"pedrito",2 =>"manolito",3 =>"josito",
                    4 =>"luisito",5=>"jorgito",6=>"miguelito",
                    7=>"paquito",8=>"fernandito",9=>"danielito");
    $nombresR=array(1 =>"INTERNET para tontos",2 =>"WORD para tontos",3 =>"LIGAR para tontos",
                    4 =>"JUGAR para tontos",5=>"REIR para tontos",6=>"COMER para tontos",
                    7=>"DORMIR para tontos",8=>"BEBER para tontos",9=>"COSER para tontos");
    
    $atributosU=array(1 =>"/LOGIN/USERNAME",2 =>"/LOGIN/PASSWORD",3 =>"/GESTION/E_MAIL",
                    4 =>"/GESTION/NOMBRE_REAL",5=>"/ACTIVIDAD/ULTIMO_ACCESO",6=>"/ACTIVIDAD/FECHA_REGISTRO");
    $atributosR=array(1 =>"/CATEGORIZACION/ENTORNO_ACADEMICO/AREA_DE_CONOCIMIENTO",2 =>"/CATEGORIZACION/ENTORNO_ACADEMICO/NIVEL",
                    3 =>"/LOCALIZACION/PLATAFORMA");
    $atributosH=array(1 =>"/COMENTARIOS",2 =>"/NOTA");


    //---------------------------------------------------

    echo "Insertando elementos tipo $tiposE[1] ...";
    $timer->start_timer();
    foreach ($nombresU as $n){
        $r=ElementHandler::insert($tiposE[1], $n);
        if (!$r) echo "<BR> FALLO EN INSERCION.( $tiposE[1],$n )";
    }

    $tiempo=$timer->end_timer();
    echo " | Hecho. Tiempo: $tiempo<BR>";

    //---------------------------------------------------

    echo "Insertando elementos tipo $tiposE[2] ...";
    $timer->start_timer();
    foreach ($nombresR as $n){
        $r=ElementHandler::insert($tiposE[2], $n);
        if (!$r) echo "<BR> FALLO EN INSERCION.( $tiposE[2],$n )";
    }
    $tiempo=$timer->end_timer();
    echo " | Hecho. Tiempo: $tiempo<BR>";

    //---------------------------------------------------

    echo "Insertando elementos tipo $tiposE[3]...";
    $timer->start_timer();
    for($i=1;$i<10;$i++){
        $idU=ElementHandler::getId($nombresU[$i]);
        $idR=ElementHandler::getId($nombresR[$i]);
        $p=$tiposE[1].'-'.$idU.'#'.$tiposE[2].'-'.$idR;
        $r=ElementHandler::insert($tiposE[3], $p);
        if (!$r) echo "<BR> FALLO EN INSERCION.( $tiposE[3],$n )";
    }
    $tiempo=$timer->end_timer();
    echo " | Hecho. Tiempo: $tiempo<BR>";

    //---------------------------------------------------

    echo "Insertando datos de los elementos...";
    $timer->start_timer();
    for($i=1;$i<10;$i++){
        $idU=ElementHandler::getId($nombresU[$i]);
        $idR=ElementHandler::getId($nombresR[$i]);
        for($j=1;$j<7;$j++){
            $v=$nombresU[$i].'|'.$atributosU[$j];
            $r=DataHandler::setValue($tiposE[1].'-'.$idU.$atributosU[$j], $v);
            if (!$r) echo "<BR> FALLO EN INSERCION.( $tiposE[1] - $idU.$atributosU[$j], $v )";
        }
        for($j=1;$j<4;$j++){
            $v=$nombresR[$i].'|'.$atributosR[$j];
            $r=DataHandler::setValue($tiposE[2].'-'.$idR.$atributosR[$j], $v);
            if (!$r) echo "<BR> FALLO EN INSERCION.( $tiposE[2] - $idR.$atributosR[$j], $v)";
        }
    }
    $tiempo=$timer->end_timer();
    echo " | Hecho. Tiempo: $tiempo<BR>";
    //---------------------------------------------------

    echo "Recuperando datos de los elementos...";
    $timer->start_timer();
    $v=array();
    for($i=1;$i<10;$i++){
        $v[$i]=array();
        $k=0;
        $idU=ElementHandler::getId($nombresU[$i]);
        $idR=ElementHandler::getId($nombresR[$i]);
        for($j=1;$j<7;$j++){
            $v[$i][$k]=DataHandler::getValue($tiposE[1].'-'.$idU.$atributosU[$j]);
            if($v[$i][$k]==NULL) echo "FALLO EN RECUPERACION. ($tiposE[1].'-'.$idU.$atributosU[$j]) ";
            $k++;
        }
        for($j=1;$j<4;$j++){
            $v[$i][$k]=DataHandler::getValue($tiposE[2].'-'.$idR.$atributosR[$j]);
            if($v[$i][$k]==NULL) echo "FALLO EN RECUPERACION. ($tiposE[2].'-'.$idR.$atributosU[$j]) ";
            $k++;
        }
    }

    $tiempo=$timer->end_timer();
    echo " | Hecho. Tiempo: $tiempo<BR>";

    echo "Se muestran los datos recuperados:<BR>";
    for($i=1;$i<10;$i++){
        $idU=ElementHandler::getId($nombresU[$i]);
        $idR=ElementHandler::getId($nombresR[$i]);
        $k=0;
        for($j=1;$j<7;$j++){
            echo " <font color='#FF0000'>$tiposE[1]</font>
                   <font color='#000000'>-</font>
                   <font color='#FF0000'>$nombresU[$i]</font>
                   <font color='#000000'> (ID: </font>
                   <font color='#0000CC'>$idU</font>
                   <font color='#000000'>).Atributo: </font>
                   <font color='#339966'>$atributosU[$j] </font>
                   <font color='#000000'>Valor:
                   <font color='#FF0000'>". $v[$i][$k]." <BR></font>";
            $k++;
        }
        echo "<BR>";
        for($j=1;$j<4;$j++){
            echo " <font color='#FF0000'>$tiposE[2]</font>
                   <font color='#000000'>-</font>
                   <font color='#FF0000'>$nombresR[$i]</font>
                   <font color='#000000'> (ID: </font>
                   <font color='#0000CC'>$idR</font>
                   <font color='#000000'>).Atributo: </font>
                   <font color='#339966'>$atributosR[$j] </font>
                   <font color='#000000'>Valor:
                   <font color='#FF0000'>". $v[$i][$k]." <BR></font>";

            $k++;
        }
        echo "<BR>";
    }

    ElementHandler::delete('pedrito');


/*
 *
 *
//Operacion: eliminar un nodo
        $nodo="/SISTEMA/CURSO/CATEGORIZACION/ENTORNO_PROFESIONAL/SECTOR";
        echo "Eliminando nodo: $nodo <BR>";
        StructHandler::deleteTree($nodo);
        muestraArbol();
        echo "<BR><BR><BR><BR><BR>";



//Operacion: eliminar un nodo
        $nodo="/SISTEMA/USUARIO/GESTION";
        echo "Eliminando nodo: $nodo <BR>";
        StructHandler::deleteTree($nodo);
        muestraArbol();
        echo "<BR><BR><BR><BR><BR>";


//Operacion: mover un nodo
        $nodo='/SISTEMA/CURSO/CATEGORIZACION/ENTORNO_PROFESIONAL';
        $padre='/SISTEMA/USUARIO';
        $hermano="";
        echo "Moviendo nodo: [$nodo] como hijo de [$padre] y hermano derecho de [$hermano]. ";
        $r=StructHandler::moveSubtree($nodo,$padre,$hermano);
        echo "Resultado: $r <BR>";
        muestraArbol();
        echo "<BR><BR><BR><BR><BR>";


//Operacion: mover un nodo. (Deshace la anterior)
        $nodo='/SISTEMA/USUARIO/ENTORNO_PROFESIONAL';
        $padre=NULL;
        $hermano="/SISTEMA/CURSO/CATEGORIZACION/ENTORNO_ACADEMICO";
        echo "Moviendo nodo: [$nodo] como hijo de [$padre] y hermano derecho de [$hermano]. ";
        $r=StructHandler::moveSubtree($nodo,$padre,$hermano);
        echo "Resultado: $r <BR>";
        muestraArbol();
        echo "<BR><BR><BR><BR><BR>";

*/


}
//CIERRE CONEXIÓN CON BASE DE DATOS
    DB::close($link);
    echo "-FIN- <BR>";
        ?>
    </body>
</html>
